package com.dyw.Day23;


/**
 * @author Devil
 * @create 2022-02-06-22:36
 *
 * 位1的个数
 * 编写一个函数，输入是一个无符号整数（以二进制串的形式），返回其二进制表达式中数字位数为 '1' 的个数（也被称为汉明重量）。
 *
 * 思路: 使用&(按位与) 因为传入的是一个无符号数的判断其二进制串形式的1的个数 我们使用移位的与1相与的方式
 * 如果二进制串结尾为1那么与1相与就是1否则就是0 我们向右移动(每次移动相应的个数 保证串中每个1都有机会与1相与运算)
 * 记录结果为1的个数 就是结果(方法不限)
 */
@SuppressWarnings("all")
public class Demo01 {
    public static void main(String[] args) {
        System.out.println(5&4);
        System.out.println(new Demo01().hammingWeight03(5));
    }
    // you need to treat n as an unsigned value

    /**
     * 右移n
     *
     * @param n
     * @return
     */
    public int hammingWeight01(int n) {
        int count = 0;
        while(n!=0){
            count+=n&1;
            n>>>=1;
        }
        return count;
    }
    public int hammingWeight02(int n) {
        int count = 0;
        for (int i = 0; i < 32; i++) {
            if (((n>>>i)&1)==1) {
                count++;
            }
        }
        return count;
    }

    /**
     * 左移1 在于n相与
     * 因为这里是1移动与n相与 所以会出线1001 与 1000 相与结果为16 这样的情况 这时判相与结果为1就不符合了
     * 所以这种方法选择的判断条件是 不为0就记录一个1
     *
     * @param n
     * @return
     */
    public int hammingWeight03(int n) {
        int count = 0;
        for (int i = 0; i < 32; i++) {
            if((n&(1<<i))!=0){
                count++;
            }
        }
        return count;
    }
}
